home *** CD-ROM | disk | FTP | other *** search
/ The X-Philes (2nd Revision) / The X-Philes Number 1 (1995).iso / xphiles / hp48hor2 / suite3d4.doc < prev    next >
Text File  |  1995-03-31  |  23KB  |  505 lines

  1. (Comp.sys.hp48) Option:  
  2. Item: 2734 by charliep@hpcvra.cv.hp.com [Charles Patton] 
  3. Subj: Suite3D 4.0 
  4. Date: 28 Jan 1993 
  5.  
  6. @ Version 4.0 @ 
  7.  
  8. _Introduction_ 
  9.  
  10.      The programs contained in this document comprise a suite of 3D 
  11. graphing/viewing utilities for the HP-48 (an HP-28 version will be forthcoming 
  12. provided sufficient interest.) 
  13.  
  14.      We had several requirements to consider in creating these programs. Our 
  15. aims were that they be (1) purely user code, (2) relatively short, and (3) 
  16. psychologically effective.  Aims (1) and (2) are due to our target audience of 
  17. educators, many of whom have little contact with technology beyond their use 
  18. of the HP-48 or HP-28. We expect that, in many situations, one user will 
  19. obtain the code in printed form, enter it into their machine, and transmit it 
  20. to others via the infrared I/O. 
  21.  
  22.      In exploring visualization techniques on a variety of machines we found 
  23. that increasing "realism" (read: ray-traced, Phong-shaded, hidden-line, etc.) 
  24. in the graphical presentation of functions of two variables did not 
  25. necessarily correlate with increasing ease of comprehension. These programs 
  26. represent the results of some of these experiments (including 
  27. time-to-completion as an important factor). 
  28.  
  29.      We invite you to try them out and experiment yourself. All suggestions, 
  30. additions, corrections, insights, commentary, and criticisms are welcome. 
  31.  
  32. _NO WARRANTY_ 
  33.     This work is provided on an "as is" basis. Hewlett-Packard Co. provides no 
  34. warranty whatsoever, either express or implied regarding the work, including 
  35. warranties with respect to its merchantability or fitness for any purpose 
  36. whatsoever. 
  37.  
  38. _Copyright_ 
  39.    Copyright (C), 1991, Hewlett-Packard Co. Permission to copy all or part of 
  40. this work is granted provided that the copies are not made or distributed for 
  41. resale (excepting nominal copying fees) and the _NO WARRANTY_ and this 
  42. copyright notice are included verbatim. Other permissions can be arranged by 
  43. contacting the author. 
  44.  
  45. _Correspondence_ 
  46.  
  47. Correspondence on Suite3D suite should be sent to Charles Patton at one of the 
  48. following addresses: 
  49.  
  50. snail-mail: 
  51.           M.S. 5U-L9 
  52.           Hewlett-Packard Co. 
  53.           1000 N.E. Circle Blvd. 
  54.           Corvallis, OR 97330 
  55.  
  56. e-mail: 
  57.           charliep@cv.hp.com    (for Internet hosts) 
  58.           hplabs!hpcvrs!charliep (for UUCP hosts) 
  59.  
  60. _Organization_ 
  61.  
  62.      Analogous to the built-in plotting routines, all the Suite3D programs 
  63. assume that the function of interest is stored in EQ. Further, they assume 
  64. that the function is represented as an expression in the variables 'X' and 'Y' 
  65. (e.g. u,v -> sin(u+v) is represented as 'SIN(X+Y)' in EQ). 
  66.  
  67. N.B.> Insure that 'X' and 'Y' are formal (no variables 'X' and 'Y'  
  68. N.B.> along the current path). 
  69.  
  70. N.B.> Most of these routines produce their best-looking output with the 
  71. N.B.> machine in "CONNECT" mode ( the CNCT button in the MODES menu  
  72. N.B.> toggles this mode.)  
  73.  
  74. N.B.> While you are examining the MODES menu, be sure to check that the  
  75. N.B.> the machine is in SYMBOLIC EVALUATION mode ( SYM button.) 
  76.  
  77.      The viewing region and other Suite3D plotting parameters are stored 
  78. in the sub-directory, VPAR. VPAR contains the variables: 
  79.     Xleft and Xright, 
  80.        controlling the width of the view-volume, 
  81.     Yfar and Ynear, 
  82.        controlling the depth of the view-volume, 
  83.     Zlow and Zhigh, 
  84.        controlling the height of the view volume, 
  85.     XXleft and XXright, 
  86.        controlling the horizontal range of the GRIDMAP and 
  87.        PARSURFACE input region, 
  88.     YYlow and YYhigh, 
  89.        controlling the vertical range of the GRIDMAP and 
  90.        PARSURFACE input region, 
  91.     Xe, Ye, and Ze, 
  92.        the coordinates of the eye-point, 
  93.     Nx and Ny, 
  94.        the number of X- and Y-increments desired, and 
  95.     hidden 
  96.        the flag indicating that hidden-line plotting should be used 
  97.        in the Yview plotter. 
  98.  
  99.       VPAR was implemented as a sub-directory so that the REVIEW key can be 
  100. used to examine the state of these variables in a way which reminds the user 
  101. of their meaning. 
  102.  
  103.      Other than VPAR, the programs here are organized into a single directory 
  104. for convenience.  Inter-dependence of the programs and other variables is 
  105. noted in the program description. 
  106.  
  107. _Oversized PICTs_ 
  108.  
  109.      All of the programs seem to work reasonably well with arbitrary sized 
  110. PICT grobs. However, ShapeToShade only draws to the upper-left-hand-corner of 
  111. the grob, and Movie only shows the display-sized region of the grob (what else 
  112. could it do?) The POSTSCRIPT plotting routines scale their results to the size 
  113. of the default PICT grob, but this should pose few problems. 
  114.  
  115. _Descriptions of the Programs_ 
  116.  
  117. SlopeField: 
  118.      The SlopeField program plots a lattice of line segments whose slopes 
  119. represent the function value at their centerpoint. Using SlopeField to plot 
  120. F(X,Y) allows your eye to pick out integral curves of the differential 
  121. equation dy/dx=F(x,y). It is quite useful in understanding where the 
  122. "arbitrary constant" in anti-derivatives comes from. 
  123.  
  124. The number of lattice points per row is determined by Nx and the number of 
  125. lattice points per column is determined by Ny. The input region sampled is 
  126. given by Xleft < X < Xright and Ynear < Y < Yfar. 
  127.  
  128. psContour: 
  129.      The psContour program (pseudo-contour) program uses SlopeField to produce 
  130. a fast contour plot of the current function. By plotting the direction field 
  131. perpendicular to the gradient of the function it allows your eye to pick out 
  132. the integral curves (contours) without actually plotting them. The apparent 
  133. contours are evenly spaced visually and so give no information on how steep 
  134. the graph is at any particular point. 
  135.  
  136. The number of lattice points per row is determined by Nx and the number of 
  137. lattice points per column is determined by Ny. The input region sampled is 
  138. given by Xleft < X < Xright and Ynear < Y < Yfar. 
  139.  
  140. YView: 
  141.      The YView program provides an oblique-view, perspective, 3D surface plot 
  142. (viewing toward increasing Y). This produces a sequence of plots of the 
  143. function along Y=constant lines in the input domain. These plots are 
  144. perspective-projected onto the view-plane relative to the eye point. In 
  145. overhead view: 
  146.                            Yfar 
  147.        +----------------+ 
  148.  .     |         |  . 
  149.        |         | 
  150.  Xleft |      /\ |Xright 
  151.     .  |     /  \       | . 
  152.      . |     .   .      |. 
  153.        +----------------+ 
  154.        .      .  .      . Ynear 
  155.          .      .       . 
  156.            .     . .    . 
  157.    ---------.----..---.--------------------- view-plane 
  158.                 .  .   . 
  159.                   . . . 
  160.                     *  eye-point (Xe,Ye,Ze) 
  161.             |<- XRNG ->| 
  162.  
  163.      The same picture holds with Zlow replacing Xleft, Zhigh replacing Xright, 
  164. and YRNG replacing XRNG (and turning your head 90 degrees to the right.) 
  165.  
  166.      In short, Ynear and Yfar and Ny determine the Y-inputs sampled; Xleft, 
  167. Xright, and the eye-point determine the XRNG; Zlow, Zhigh, and the eye-point 
  168. determine the YRNG. This computation is performed by the utility, SetWindow. 
  169.  
  170.      This is a simple "divide-by-depth" method for perspective plotting where 
  171. the viewplane is always 1 unit from the viewpoint and is parallel to the x-z 
  172. plane. Since the perspective transformation in the case can be implemented by 
  173. a simple change of coordinates, plotting individual sections is no slower than 
  174. ordinary plots. 
  175.  
  176.      If 'hidden' is non-zero, each plot of a sampled point will erase the 
  177. column of pixels below it. Since the curves are plotted back-to-front, this 
  178. results in a hidden-line plot of the surface. It works best if RES is #1 or #2 
  179. and connected-mode is on (CNCT.) 
  180.  
  181.      Note: To abort this routine, press the [ON] key and then press the 
  182. [ENTER] key. 
  183.  
  184. WIREFRAME: 
  185.      The WIREFRAME program plots an oblique-perspective view of a wire-frame 
  186. model of the surface with Nx vertices in each row and Ny vertices in each 
  187. column. It calls SetWindow to set the XRNG and YRNG and uses much the same 
  188. technique as Yview. The sampled region is determined by Xleft, Xright, Ynear, 
  189. and Yfar. 
  190.  
  191. ShapeToShade: 
  192.      The ShapeToShade program plots the function as a Phong-shaded figure 
  193. viewed from above with a light source from above, that is, shaded according to 
  194. the angle the tangent plane makes with the incident light source. It assumes 
  195. that the variable DPAR contains sixteen 4x4 GROBS to serve as the dithering 
  196. pattern. The dither patterns included are probably not the best possible: 
  197. insights along these lines are most welcome. The variables Xleft, Xright, 
  198. Yfar, and Ynear determine the inputs sampled. 
  199.  
  200. Movie: 
  201.      The Movie program plots Ny cross-sections of the function plot varying 
  202. the Y-value from Yfar to Ynear. The viewing window is determined by Xleft, 
  203. Xright, Zlow, and Zhigh. Having plotted these frames, it calls the utility 
  204. program, uSMOV (utility-show-movie), to play them  back in repeated sequence. 
  205.  
  206.      Note: To abort this routine in the plotting phase, press the [ON] key and 
  207. then press the [ENTER] key.  To end the movie press any key (e.g. [ENTER]). 
  208.  
  209. uSMOV: 
  210.      The uSMOV (utility show-movie) program takes an alternating sequence of 
  211. <n> grobs and <n> descriptors (with <2n> on the top of the stack) from the 
  212. stack and shows them in sequence, thus producing a movie effect. Stop the show 
  213. with any key press but [ON]. 
  214.  
  215. SSTMovie: 
  216.      After stopping Movie or uSMOV, you can use SSTMovie to step through the 
  217. sequence of movie frames. To show the next frame, press any key but [ENTER] or 
  218. [ON]. Press [ENTER] to quit. 
  219.  
  220. PARSURFACE: 
  221.      The PARSURFACE routine takes a 3-vector-valued function of two variables 
  222. (stored in EQ as a list of three expression in X and Y) and draws an 
  223. oblique-view, perspective, 3D plot of a wire-frame model of the surface 
  224. determined by the image in 3-space of the graph of this function, that is, a 
  225. parametrized surface. 
  226.  
  227.      The function determined by the current equation is sampled in a grid with 
  228. Nx samples in each row and Ny samples in each column with inputs from the 
  229. region [XXleft,XXright]x[YYlow,YYhigh].  Each sample is perspective-projected 
  230. onto the View Screen along the line connecting the sample and the eye-point 
  231. (Xe,Ye,Ze).  Neighboring samples are connected by straight lines. The region 
  232. of the View Screen represented in the PICT grob (and hence on the LCD) is 
  233. determined by the projection of the View Volume on the View Screen. 
  234.  
  235.      A nice starter example is a parametrized sphere. With the triple, { 
  236. 'SIN(X)*SIN(Y)' 'COS(X)*SIN(Y)' 'COS(Y)' } stored as EQ, the view-volume set 
  237. to [-1.1, 1.1]x[-1.1, 1.1]x[-1.1, 1.1], the eye-point set to (-2.2, 0, 0.5), 
  238. and the input range set to [0, 6.5]x[0, 3.15] (RADIANS MODE, PLEASE!), 
  239. PARSURFACE will produce a perspective plot of a sphere. 
  240.  
  241. GRIDMAP: 
  242.      The GRIDMAP routine takes a complex valued function (stored in EQ as a 
  243. complex-valued expression in X and Y) and plots the image under this map of a 
  244. rectilinear grid with Nx columns and Ny rows which lives in the region 
  245. [XXleft,XXright]x[YYnear,YYfar]. The portion of the output plane shown on the 
  246. screen is "floor" of the view-volume, [Xleft,Xright]x[Ylow,Yhigh]. These are 
  247. additional variables in VPAR. The trig and arc-trig functions (e.g. 
  248. 'SIN(X+i*Y)') give very interesting "starter" examples. 
  249.  
  250.      To get the image of a polar grid rather than a rectilinear grid, 
  251. precompose you function with the polar-to-rectangular coordinate change: 
  252.  
  253.   'SIN(X+i*Y)' {X 'X*COS(Y)' Y 'X*SIN(Y)'} | 
  254. => 'SIN(X*COS(Y)+i*X*SIN(Y))' 
  255.  
  256.      Setting 'Xleft' to 0 and 'Xright' to 1 then corresponds to setting (the 
  257. nonexistent) 'Rlow' to 0 and 'Rhigh' to 1. Similarly, settign 'Ynear' to 0 and 
  258. 'Yfar' to 2pi corresponds to setting the angular range. 
  259.  
  260. SetWindow: 
  261.     This utility maps the view volume and eye-point coordinates into the 
  262. appropriate XRNG and YRNG values for perspective plotting (see the picture in 
  263. the YView description.) It also gets all the plotting parameters onto the 
  264. stack. 
  265.  
  266. _The POSTSCRIPT Drawing Utilities_ 
  267.  
  268.      Since the PS utilities take up a fair amount of space, and are not of 
  269. immediate use to someone without Adobe Illustrator and/or a POSTSCRIPT 
  270. printer, all of the above programs have been designed to work properly even if 
  271. the PS utility set is not installed. If this is your situation, simply delete 
  272. the section of the Suite3D listing starting at the comment, @ Begin POSTSCRIPT 
  273. Stuff @, before you send the file to the '48, otherwise, read on. 
  274.  
  275. When POSTSCRIPT Output Mode is switched on (using PSTOGGLE,) all of the 
  276. plotting routines above will, in addition to their normal function, accumulate 
  277. POSTSCRIPT commands corresponding to what they were attempting to plot on the 
  278. '48 display. These are saved in a sequence of variables, PSOUT, PSOUT&, 
  279. PSOUT&&, etc. Although the output is simply ASCII text saved as '48 character 
  280. strings, it is broken up into at-most-4Kbyte chunks so that it is easier to 
  281. handle on the '48. When this text is inserted into a "boilerplate" file 
  282. (described below) the resulting file can be sent to a POSTSCRIPT printer, or 
  283. edited/viewed in the Adobe Illustrator, or compatible, POSTSCRIPT Drawing 
  284. program. 
  285.  
  286. _Descriptions of the User-intended Programs__ 
  287.  
  288. PSTOGGLE: 
  289.      When executed, this routine switches between normal (no-PS output) and 
  290. PS-output definitions of the basic graphics routines (that is, draw, line, and 
  291. tile) used in the other Suite3D programs. The new state ("PS is ON" or "PS is 
  292. OFF") is displayed on completion of the routine. 
  293.  
  294. PSRESET: 
  295.     This routine should be used to simply clear any leftover data in the 
  296. output variables PSOUT, PSOUT&, etc. making room for a new run. 
  297.  
  298. _Using the PS Capabilities_ 
  299.  
  300.   _The Boilerplate File_ 
  301.     To effectively use the PS output from the '48 you need to have a 
  302. "boilerplate" POSTSCRIPT file in which you can insert your '48 output (it can 
  303. even reside on the '48 if you have room .. in this case you can have your '48 
  304. talk directly to a POSTSCRIPT printer ..) The easiest way to get one is to 
  305. create a new illustration in Illustrator with no actual drawing but with the 
  306. Fill set to NONE, the Line Width set to, say, .5, and the Line Color set to 
  307. 100% BLACK.  Save this as a POSTSCRIPT (i.e. text) file HP48PS.ai or some such 
  308. name. 
  309.  
  310. Open the resulting file with a text editor so you can see what it looks like. 
  311. There are two regions of interest. The first is the line near the top of the 
  312. file that looks like 
  313.  
  314. %%BoundingBox:x1 y1 x2 y2 
  315.  
  316. where x1, x2, y1, and y2 are integers. You should change these to 
  317.  
  318. %%BoundingBox:0 0 131 64 
  319.  
  320. While this is not strictly necessary, it will allow you to include the '48 
  321. produced illustration directly in a TeX document an have the size computed 
  322. correctly. 
  323.  
  324. The next region of interest is  near the end of file and begins with 
  325.  
  326. %%Note: 
  327.  
  328. and ends with 
  329.  
  330. %%Trailer 
  331.  
  332. Clear out anything between these two (this is the region where the '48 
  333. output will be inserted) and save the resulting file. This will be your 
  334. "boilerplate" file. 
  335.  
  336.   _Creating the Output_ 
  337.      This part is quite easy. After you have found a nice view with one of 
  338. the graphing utilities (with PS output turned off to speed things up) set the 
  339. RES quite high ( #13d RES [ENTER] will do nicely ) and numeric display 
  340. format quite small ( 2 FIX [ENTER] seems pretty good ) to save on room, use 
  341. PSRESET to clear the variables (if you want to get rid of a previous session) 
  342. and PSTOGGLE to activate PS mode. Now re-active the chosen plotting routine 
  343. and let it finish. 
  344.  
  345. When it is finished, transfer the contents of all the non-empty PSOUT 
  346. variables (in ASCII mode, please) in order (PSOUT, PSOUT&, PSOUT&&, etc.) into 
  347. the region of the boilerplate file noted above. Save the resulting file under 
  348. a new name (to preserve your boilerplate file) and you are ready to send it to 
  349. a POSTSCRIPT printer, include it in a TeX, or muck around with it in a 
  350. POSTSCRIPT drawing program. 
  351.  
  352.   _RAM Requirements, etc._ 
  353.      The routines require very different amounts of RAM (corresponding 
  354. directly with the output size.) A reasonable psContour results in under 4K of 
  355. output while a ShapeToShade can result in nearly 40K of output. The other 
  356. routines fall between these two (with reasonable settings for Nx, Ny, RES, and 
  357. FIX.) If desired, one could modify the PSADDTO routine (see below) to simply 
  358. send accumulated data out over one of the datacomm ports thus passing off the 
  359. space requirements to the machine at the other end of the line. 
  360.  
  361.   _What's Been Tried_ 
  362.      I've used the PS output in the form discussed above with equally good 
  363. results in Illustrator88 on a Mac IIx, direct printing to an Apple 
  364. LaserWriter, in a Textures TeX file, and in Adobe Illustrator 1.1 under 
  365. Windows 3.0. 
  366.  
  367. POSTSCRIPT, Adobe Illustrator, and Illustrator88 are trademarks of Adobe 
  368.     Systems Corporation; 
  369. Textures is a trademark of Blue Sky Research, Inc.; 
  370. Apple LaserWriter is a trademark of Apple Computer, Inc.;  
  371. Windows is a trademark of MicroSoft Corporation; 
  372. TeX is a trademark of the American Mathematical Society. 
  373.  
  374. _Descriptions of the Utilities_ 
  375.  
  376. PSTILE: 
  377.     This utility takes a screen location (as #pixel_row #pixel_column) 
  378. followed by two unused parameters and a gray-scale value in the range [0,1], 
  379. returns these unchanged to the stack and outputs the PS code to draw a  
  380. filled-in 4x4 square at the corresponding location and with the corresponding 
  381. gray-scale fill. 
  382.  
  383. PSADDTO: 
  384.    This utility takes a string off the stack and adds it to the current 
  385. PS output variable, checking for overflow of the 4000 character limit 
  386. and starting a new output variable if the limit is exceeded. 
  387.  
  388. PSDRAW: 
  389.    Draws the current EQ (assumed to be a single expression) and outputs 
  390. a PS representation of the curve drawn as a connected sequence of Bezier 
  391. curves. It assumes that the plot type is currently FUNCTION. 
  392.  
  393. PSPARDRAW 
  394.   Draws the current EQ (assumed to be a single expression) and outputs 
  395. a PS representation of the curve drawn as a connected sequence of 
  396. Bezier curves. It assumes that the plot type is currently PARAMETRIC. 
  397.  
  398. PSLINE: 
  399.   Takes a pair of complex numbers representing the endpoints of a line, 
  400. draws the line on the screen and outputs the corresponding PS line drawing 
  401. command. 
  402.  
  403. CURRENTOUT: 
  404.   A variable containing the name of the current PS output variable  
  405. ('PSOUT', 'PSOUT&', 'PSOUT&&', etc.) 
  406.  
  407. PSCO: 
  408.   Takes a complex number and returns, as a string, the corresponding 
  409. PS coordinate value. 
  410.  
  411. PSCOPAIR: 
  412.   Takes a pair of complex numbers representing the third and fourth of 
  413. four Bezier curve control points and returns these as a string representing 
  414. the PS cross-over sequence of a Bezier curve. 
  415.  
  416. derFP 
  417.   A definition of the derivative of the FP function suitable for 
  418. supporting the PS drawing in GRIDMAP. 
  419.  
  420. derIP 
  421.   A definition of the derivative of the IP function suitable for 
  422. supporting the PS drawing in GRIDMAP. 
  423.  
  424. derIM 
  425.   A definition of the derivative of the IM function suitable for 
  426. supporting the PS drawing in GRIDMAP. 
  427.  
  428. derRE 
  429.   A definition of the derivative of the RE function suitable for 
  430. supporting the PS drawing in GRIDMAP. 
  431.  
  432. ---------- 
  433.  
  434. _Suite3D Version 4.0 Additions and Changes_ 
  435.  
  436. This version builds on the GRIDMAP functionality of 3.0 to provide for 
  437. parametric surface plotting, PARSURFACE. In addition, it changes the 
  438. conventional interpretation of XXleft, Xright, etc. from indicating 
  439. the output range to the indicating the input range. This allows 
  440. PARSURFACE to also use these specifications as well as continuing to 
  441. use the normal view-volume parameters to describe the 3D region. 
  442.  
  443. With the addition of the parametric surface plot, we pretty much 
  444. complete the graphical tecniques for functions of two variables. In 
  445. fact, while this document has referred to  3D Plotting, this is 
  446. something of a misnomer.  A better name would be "visualization 
  447. techniques for functions of two variables." This would cover the 
  448. perspective view of the graph of a scalar function of two variables 
  449. (WIREFRAME), the slicing view of a scalar function of two variables 
  450. (Movie), the contour-map view of a scalar function of two variables 
  451. (psContour), the slope interpretation of a scalar function of two 
  452. variables (SlopeField), the mapping grid visualization of a 
  453. 2-vector-valued function of two variables (GRIDMAP), and the image 
  454. graph of a 3-vector-valued function of two variables (PARSURFACE). 
  455.  
  456. _Suite3D Version 3.0 Additions and Changes_ 
  457.  
  458.  
  459. Version 3.0 adds one new feature, GRIDMAP, which presents a method 
  460. of visualizing maps from the plane to the plane. The idea is simple: 
  461. draw the image under the mapping function of a rectilinear grid residing 
  462. in the input plane. Besides being used in various graphing programs, such 
  463. as 'f(z)' by Lascoux Graphics, it has been shown to be an effective aid 
  464. in understanding iterated maps of the plane (see "Grid Imaging for a Two- 
  465. Dimensional Map," Judd, Mees, Aihara, and Toyada, _International Journal 
  466. of Bifurcation and Chaos_, V1 N1, March 1991.) 
  467.  
  468. As usual, POSTSCRIPT output capabilites for this plotting method are 
  469. included and, as usual, you can leave them out if you are short on 
  470. room. 
  471.  
  472. _Suite3D Version 2.0 Additions and Changes_ 
  473.  
  474. In addition to the slopefield, pseudo-contour, oblique perspective, 
  475. Phong-Shaded, and movie plotting capabilities, version 2.0 introduces 
  476.  
  477. *Major Feature*  POSTSCRIPT(TM) output for all the graphing routines in a 
  478. form suitable for editing/viewing with Adobe Illustrator(TM), sending to a 
  479. POSTSCRIPT printer, or including in a \special {\illustration} TeX(TM) 
  480. command. Included is a PS-output version of the standard DRAW command. 
  481.  
  482. All the output is in terms of line segments, Bezier curves, and fill- 
  483. regions so that it can be scaled to arbitrary size or printed at 
  484. very high resolution without loss of smoothness. 
  485.  
  486. If you have ever wanted to produce high-quality function-graph illustrations 
  487. with the flexibility that '48 provides, this is for you! (You might be able 
  488. to tell that I'm pretty happy with this item.) 
  489.  
  490. *Significant Addition* (relatively) fast WIREFRAME graphing in oblique 
  491. 3D perspective with adjustable grid spacing. 
  492.  
  493. *Easier View Switching* The 3D plotting parameters have been rearranged 
  494. so that all the routines can compute an appropriate XRNG and YRNG from 
  495. these. Once set, you can go from view to view with no manual adjustments. 
  496.  
  497. *Other Enhancements* 
  498.    A Movie single-step has been added so that you can easily step through a 
  499.    Movie frame-by-frame. 
  500.  
  501.    All routines now use user-specified number of X-increments and 
  502.    Y-increments, as appropriate, so that the WIREFRAME grid, the lattice of 
  503.    slopefield segements, and number of Movie frames, etc. all references these 
  504.    numbers rather than being "hard coded" as in the earlier versions. 
  505.